package com.cares.event.utils;

import java.util.Iterator;

import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import com.cares.event.constant.XmlNodeConstant;

public class DomUtils {
	
	/**
	 * 解析xml格式的字符串
	 * @param xml
	 * 返回xml document
	 */
	public static Element getRootbyStrXml(String xml) {
		Element root = null;
		 try {
			 root = DocumentHelper.parseText(xml).getRootElement(); // 将字符串转为XML，并获取根对象
		 }catch (DocumentException e) {
			 e.printStackTrace();
		 } catch (Exception e) {
			 e.printStackTrace();
		 }
		 return root;
	}
	
	/**
	 * 获取xml中开始节点
	 * param:  element-节点，nodeName-要获取开始的节点名称
	 * @return 流程节点对象
	 */
	public static Element getStartNodeByName(Element root){
		Iterator iter = root.elementIterator(XmlNodeConstant.NODE_START); // 获取节点下的子节点
		return (Element)iter.next();
	}
	
	
	/**
	 * 获取节点nodeName，且其属性name=node_attr_name，且值为node_attr_value的流程节点
	 * param:  element-节点，nodeName-要获取的节点名称，node_attr_name： 节点属性-name
	 * @return 流程节点对象
	 */
	public static Element getNodeByName(Element element, String nodeName, String node_attr_name, String node_attr_value){
		Iterator iter = element.elementIterator(nodeName); // 获取节点下的子节点
		String attr_value = "";
		Element e = null;
		while (iter.hasNext()){
			e = (Element)iter.next();
			attr_value = e.attributeValue(node_attr_name);
			if(node_attr_value.equals(attr_value)){
				break;
			}
		}
		return e;
	}
	
	/**
	 * 判断element是否包含节点nodeName，且其属性name=node_attr_name，且值为node_attr_value的流程节点
	 * param:  element-节点，nodeName-要获取的节点名称，node_attr_name： 节点属性-name
	 * @return 流程节点对象
	 */
	public static boolean isIncludeAttr(Element element, String nodeName, String node_attr_name, String node_attr_value){
		Iterator iter = element.elementIterator(nodeName); // 获取节点下的子节点
		String attr_value = "";
		Element e = null;
		while (iter.hasNext()){
			e = (Element)iter.next();
			attr_value = e.attributeValue(node_attr_name);
			if(node_attr_value.equals(attr_value)){
				return true;
			}
		}
		return false;
	}
	
	
	/**
	 * 根据节点的属性唯一的name值查找节点
	 * root：跟节点，attrNamevalue：属性name的值
	 */
	public static Element getNodeByAttrName(Element root, String attrNamevalue){
		Iterator iter = root.elementIterator();
		String attr_value = "";
		Element e = null;
		while (iter.hasNext()){
			e = (Element)iter.next();
			attr_value = e.attributeValue(XmlNodeConstant.NODE_ATTR_NAME);
			if(attrNamevalue.equals(attr_value)){
				break;
			}
		}
		return e;
	}
	
	/**
	 * 解析当前节点元素，获取其走向
	 * @param taskElement
	 * @param outValue 
	 * @return
	 */
	public static String getTaskAttrTo(Element taskElement, String outValue){
		Iterator iter = taskElement.elementIterator(XmlNodeConstant.NODE_TRANSITION);
		Element e = null;
		String result = "";
		while (iter.hasNext()){
			e = (Element)iter.next();
			if(e.attributeValue(XmlNodeConstant.NODE_ATTR_NAME).equals(outValue)){
				result = e.attributeValue(XmlNodeConstant.NODE_TRANSITION_ATTR_TO);
				break;
			}
		}
		return result;
		
	}
	
}
